package com.controladores.controlvehicular.comunicacion;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.IOException;
import java.net.Socket;

import org.jasypt.encryption.pbe.StandardPBEStringEncryptor;

import com.controladores.controlvehicular.basededatos.GestorBaseDatos;


public class ComunicacionTCP {
	private String ip = "";
	private int puerto = 0;
	Socket sk;
	DataInputStream entrada;
	DataOutputStream salida;
	
	private String informacionRegistro;
	private String[] datosRecibidos;
	private String claveEncriptacion="SI@P/ml*vc#";
	
	public DataInputStream getEntrada() {
		return entrada;
	}

	public void setEntrada(DataInputStream entrada) {
		this.entrada = entrada;
	}

	public DataOutputStream getSalida() {
		return salida;
	}

	public void setSalida(DataOutputStream salida) {
		this.salida = salida;
	}

	public void abrirComunicacion() {
		GestorBaseDatos crear = new GestorBaseDatos(null);
		crear.abrirBaseDatos();
		ip = crear.obtenerIp();
		String x = "";
		x = crear.obtenerpuerto();
		puerto = Integer.parseInt(x);
		crear.close();
	}

	public String gestionarConexionRegistroRecarga(String usuario,
			String nombreZona, String idSubCalle, String fechaControl,
			String horaControl, String placa, String codigoR) {
		String salida = "";
		abrirComunicacion();
		String informacion = "##;009;" + usuario + ";" + nombreZona + ";"
				+ idSubCalle + ";" + fechaControl + ";" + horaControl + ";"
				+ placa + ";" + codigoR + ";**";
		informacionRegistro=encrypt(informacion, claveEncriptacion);
		if (connect() == true) {
			sendMensaje(informacionRegistro);
			String informacionRecibida=decrypt(receiveMensaje(), claveEncriptacion);
			datosRecibidos = descomposeTrama(informacionRecibida);
			if (datosRecibidos[0].compareTo("##") == 0) {
				if (datosRecibidos[1].compareTo("010") == 0) {
					if (datosRecibidos[2].compareTo("1") == 0) {
						salida = "1";
					}
					if (datosRecibidos[2].compareTo("0") == 0) {
						salida = "0";
					}
				}
			}
		} else {
			salida = "e";
		}
		return salida;
	}

	public boolean connect() {
		try {
			sk = new Socket(ip, puerto);
			if (sk.isConnected() == true) {
				return true;
			} else {
				return false;
			}
		} catch (Exception e) {
			e.printStackTrace();
			return false;
		}

	}

	public void sendMensaje(String mensaje) {
		try {
			salida = new DataOutputStream(new BufferedOutputStream(
					sk.getOutputStream()));
			salida.writeUTF(mensaje);
			salida.flush();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	public String receiveMensaje() {
		String mensajeRecibido = "";
		try {
			entrada = new DataInputStream(new BufferedInputStream(
					sk.getInputStream()));
			mensajeRecibido = getEntrada().readUTF();
			// mensajeRecibido = getEntrada().readLine();
			// Toast.makeText(null, mensajeRecibido, Toast.LENGTH_LONG)
			// .show();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

		return mensajeRecibido;
	}

	public String[] descomposeTrama(String trama) {
		String[] subtramas = trama.split(";");
		return subtramas;
	}

	public String gestionarConexionValidarCodRecarga(String codigoR, String placa) {
		// TODO Auto-generated method stub
		abrirComunicacion();
		String salida = "";
		String informacion = "##;007;" + codigoR +";"+placa+ ";**";//aumentar placa
		informacionRegistro=encrypt(informacion, claveEncriptacion);
		if (connect() == true) {
			sendMensaje(informacionRegistro);
			String informacionRecibida=decrypt(receiveMensaje(), claveEncriptacion);
			datosRecibidos = descomposeTrama(informacionRecibida);
			if (datosRecibidos[0].compareTo("##") == 0) {
				if (datosRecibidos[1].compareTo("008") == 0) {
					if (datosRecibidos[2].compareTo("1") == 0) {
						salida = "1";// corecto
					}
					if (datosRecibidos[2].compareTo("0") == 0) {
						salida = "0";// incorecto multa ausencia tarjeta
					}
				}
			}
		} else {
			salida = "e";
		}

		return salida;

	}

	public String gestionarConexionValidarCodTarjeta(String codigoT, String usuario) {
		// TODO Auto-generated method stub
		abrirComunicacion();
		String salida = "";
		String informacion = "##;007;" + usuario +";"+ codigoT + ";**";
		informacionRegistro=encrypt(informacion, claveEncriptacion);
		if (connect() == true) {
			sendMensaje(informacionRegistro);
			String informacionRecibida=decrypt(receiveMensaje(), claveEncriptacion);
			datosRecibidos = descomposeTrama(informacionRecibida);
			if (datosRecibidos[0].compareTo("##") == 0) {
				if (datosRecibidos[1].compareTo("008") == 0) {
					if (datosRecibidos[2].compareTo("1") == 0) {
						salida = "1";// codigo corecto
					}
					if (datosRecibidos[2].compareTo("0") == 0) {
						salida = "0";// crear nuevo codigo
					}
					if (datosRecibidos[2].compareTo("2") == 0) {
						salida = "2";// tarjeta caducada
					}
					if (datosRecibidos[2].compareTo("3") == 0) {
						salida = "3";// tarjeta fuera de rango 
					}
				}
			}
		} else {
			salida = "e";
		}
		return salida;
	}

	public String gestionarConexionRegistroTarjeta(String usuario,
			String nombreZona, String idSubCalle, String fechacontrol,
			String horaControl, String color, String placa, String marca,
			String espaciosTarjeta, String horallegada, String codigoT) {
		// TODO Auto-generated method stub
		String salida = "";
		abrirComunicacion();
		String informacion = "##;009;" + usuario + ";" + nombreZona + ";"
				+ idSubCalle + ";" + fechacontrol + ";" + horaControl + ";"
				+ color + ";" + placa + ";" + marca + ";" + espaciosTarjeta
				+ ";" + horallegada + ";" + codigoT + ";**";
		informacionRegistro=encrypt(informacion, claveEncriptacion);
		if (connect() == true) {
			sendMensaje(informacionRegistro);
			String informacionRecibida=decrypt(receiveMensaje(), claveEncriptacion);
			datosRecibidos = descomposeTrama(informacionRecibida);
			if (datosRecibidos[0].compareTo("##") == 0) {
				if (datosRecibidos[1].compareTo("010") == 0) {
					if (datosRecibidos[2].compareTo("1") == 0) {
						salida = "1";// e registro se ha echo sin ninguna
										// novedad
					}
					if (datosRecibidos[2].compareTo("0") == 0) {
						salida = "0";// existen espepacios ya utilizados..
						// multa Tarjeta borrada uso indebido tarjeta
					}
					if (datosRecibidos[2].compareTo("2") == 0) {
						salida = "2";// llamar al menu desea crearlo codigo
						// ComunicacionTCP comunicacion = new ComunicacionTCP();
						// RegistroTarjeta enviar =new RegistroTarjeta();
						// enviar.menuRevicionCodigoTarjeta();
					}
					if (datosRecibidos[2].compareTo("3") == 0) {
						salida = "3";// tarjeta vencida uso indebido tarjeta
					}
					if (datosRecibidos[2].compareTo("4") == 0) {
						salida = "4";// tarjeta vencida uso indebido tarjeta
					}
				}
			}
		} else {
			salida = "e";
		}

		return salida;
	}

	public String registroExoneradosDiscapacitados(String infousuario,
			String infoNombreZona, String infoIdSubCalle,
			int infoespacioRegistro, String placa, String color, String marca,
			String horaControl, String fechacontrol) {
		// TODO Auto-generated method stub
		String salida = "";
		abrirComunicacion();
		String informacion = "##;011;" + infousuario + ";" + infoNombreZona
				+ ";" + infoIdSubCalle + ";" + fechacontrol + ";" + horaControl
				+ ";" + placa +";**";
		informacionRegistro=encrypt(informacion, claveEncriptacion);
		if (connect() == true) {
			sendMensaje(informacionRegistro);
			String informacionRecibida=decrypt(receiveMensaje(), claveEncriptacion);
			datosRecibidos = descomposeTrama(informacionRecibida);
			if (datosRecibidos[0].compareTo("##") == 0) {
				if (datosRecibidos[1].compareTo("012") == 0) {
					if (datosRecibidos[2].compareTo("1") == 0) {
						salida = "1";// Correcto
					}
					if (datosRecibidos[2].compareTo("0") == 0) {
						salida = "0";// placa no existe
					}
				}
			}
		} else {
			salida = "e";
		}
		return salida;
	}

	public String registroExoneradosMunicipio(String infousuario,
			String infoNombreZona, String infoIdSubCalle,
			int infoespacioRegistro, String placa, String color, String marca,
			String horaControl, String fechacontrol) {
		// TODO Auto-generated method stub
		String salida = "";
		abrirComunicacion();
		
		String informacion = "##;011;" + infousuario + ";" + infoNombreZona
				+ ";" + infoIdSubCalle + ";" + fechacontrol + ";" + horaControl
				+ ";" + placa +";**";
		informacionRegistro=encrypt(informacion, claveEncriptacion);
		if (connect() == true) {
			sendMensaje(informacionRegistro);
			String informacionRecibida=decrypt(receiveMensaje(), claveEncriptacion);
			datosRecibidos = descomposeTrama(informacionRecibida);
			if (datosRecibidos[0].compareTo("##") == 0) {
				if (datosRecibidos[1].compareTo("012") == 0) {
					if (datosRecibidos[2].compareTo("1") == 0) {
						salida = "1";// Correcto
					}
				}
			}
		} else {
			salida = "e";
		}
		return salida;
	}

	/*public String registroMultas(String infousuario, String infoNombreZona,
			String infoIdSubCalle, String fecha, String hora,
			String infraciones, String monto) {
		// TODO Auto-generated method stub
		String salida = "";
		abrirComunicacion();
		informacionRegistro = "##;015;" + infousuario + ";" + infoNombreZona
				+ ";" + infoIdSubCalle + ";" + fecha + ";" + hora + ";"
				+ infraciones + ";" + monto + ";**";
		if (connect() == true) {
			sendMensaje(informacionRegistro);
			datosRecibidos = descomposeTrama(receiveMensaje());
			if (datosRecibidos[0].compareTo("##") == 0) {
				if (datosRecibidos[1].compareTo("016") == 0) {
					if (datosRecibidos[2].compareTo("1") == 0) {
						salida = "1";// Correcto
					}
				}
			}
		} else {
			salida = "e";
		}
		return salida;
	}*/

	public String registroMultasSistTarjeta(String infousuario,
			String infoNombreZona, String infoIdSubCalle, String fecha,
			String hora, String placa, String codigo, String nombreCliente,
			String idServidor) {
		// TODO Auto-generated method stub
		String salida = "";
		abrirComunicacion();
		String informacion = "##;013;" + infousuario + ";" + infoNombreZona
				+ ";" + infoIdSubCalle + ";" + fecha + ";" + hora + ";" + placa
				+ ";" + codigo + ";" + nombreCliente + ";" + idServidor + ";**";
		informacionRegistro=encrypt(informacion, claveEncriptacion);
		if (connect() == true) {
			sendMensaje(informacionRegistro);
			String informacionRecibida=decrypt(receiveMensaje(), claveEncriptacion);
			datosRecibidos = descomposeTrama(informacionRecibida);
			if (datosRecibidos[0].compareTo("##") == 0) {
				if (datosRecibidos[1].compareTo("014") == 0) {
					if (datosRecibidos[2].compareTo("1") == 0) {
						salida = "1";// Correcto
					}
					if (datosRecibidos[2].compareTo("0") == 0) {
						salida = "0";// Revisar codigo Usado
					}
				}
			}
		} else {
			salida = "e";
		}
		return salida;
	}

	public String gestionarUpdateRegistroTarjeta(String codigoRegistrado,
			String espaciosTarjeta, String horallegada, String codigoT,
			String fechacontrol, String horaControl) {
		// TODO Auto-generated method stub
		String salida = "";
		abrirComunicacion();
		String informacion = "##;017;" + codigoRegistrado + ";"
				+ espaciosTarjeta + ";" + horallegada + ";" + codigoT + ";"
				+ fechacontrol + ";" + horaControl + ";**";
		informacionRegistro=encrypt(informacion, claveEncriptacion);
		if (connect() == true) {
			sendMensaje(informacionRegistro);
			String informacionRecibida=decrypt(receiveMensaje(), claveEncriptacion);
			datosRecibidos = descomposeTrama(informacionRecibida);
			if (datosRecibidos[0].compareTo("##") == 0) {
				if (datosRecibidos[1].compareTo("018") == 0) {
					if (datosRecibidos[2].compareTo("1") == 0) {
						salida = "1";// Correcto
					}
					if (datosRecibidos[2].compareTo("0") == 0) {
						salida = "0";// existen espepacios ya utilizados..
						// multa Tarjeta borrada uso indebido tarjeta
					}
					if (datosRecibidos[2].compareTo("2") == 0) {
						salida = "2";// llamar al menu desea crearlo codigo
						// ComunicacionTCP comunicacion = new ComunicacionTCP();
						// RegistroTarjeta enviar =new RegistroTarjeta();
						// enviar.menuRevicionCodigoTarjeta();
					}
					if (datosRecibidos[2].compareTo("3") == 0) {
						salida = "3";// tarjeta vencida uso indebido tarjeta
					}
				}
			}
		} else {
			salida = "e";
		}
		return salida;
	}

	public String gestionarConexionSmsConfirmacionValidacion(
			String confirmacion, String codigoT, String trama, String usuario) {
		// TODO Auto-generated method stub
		String salida = "";
		abrirComunicacion();
		String informacion = "##;" + trama+";"+ usuario + ";" + confirmacion + ";"
				+ codigoT + ";**";
		informacionRegistro=encrypt(informacion, claveEncriptacion);
		if (connect() == true) {
			sendMensaje(informacionRegistro);
			String informacionRecibida=decrypt(receiveMensaje(), claveEncriptacion);
			datosRecibidos = descomposeTrama(informacionRecibida);
			if (datosRecibidos[0].compareTo("##") == 0) {
				if (datosRecibidos[1].compareTo("016") == 0) {
					if (datosRecibidos[2].compareTo("1") == 0) {
						salida = "1";// Correcto se a enviado
					}
				}
			}
		} else {
			salida = "e";
		}
		return salida;
	}

	public String gestionarConexionSmsConfirmacionValidacionUpdate(
			String confirmacion, String codigoRegistrado,
			String espaciosTarjeta2, String horallegada13, String codigoT2,
			String fechacontrol2, String horaControl2) {
		// TODO Auto-generated method stub
		String salida = "";
		abrirComunicacion();
		String informacion = "##;021;" + confirmacion + ";" + codigoRegistrado
				+ ";" + espaciosTarjeta2 + "; " + horallegada13 + ";"
				+ codigoT2 + ";" + fechacontrol2 + ";" + horallegada13 + ";"
				+ horaControl2 + ";**";
		informacionRegistro=encrypt(informacion, claveEncriptacion);
		if (connect() == true) {
			sendMensaje(informacionRegistro);
		} else {
			salida = "e";
		}
		return salida;
	}

	public String gestionarConexionSmsConfirmacionValidacionTarjetaN(
			String confirmacion, String usuario2, String nombreZona2,
			String idSubCalle2, String fechacontrol2, String horaControl2,
			String color2, String placa2, String marca2,
			String espaciosTarjeta2, String horallegada13, String codigoT2) {
		// TODO Auto-generated method stub
		String salida = "";
		abrirComunicacion();
		String informacion = "##;017;" + confirmacion + ";" + usuario2 + ";"
				+ nombreZona2 + ";" + idSubCalle2 + ";" + fechacontrol2 + ";"
				+ horaControl2 + ";"  + color2 + ";"
				+ placa2 + ";" + marca2 + ";"  + espaciosTarjeta2
				+ ";" + horallegada13 + ";" + codigoT2 + ";**";
		informacionRegistro=encrypt(informacion, claveEncriptacion);
		if (connect() == true) {
			
			sendMensaje(informacionRegistro);
		} else {
			salida = "e";
		}
		return salida;
	}
	
	public String enviarPosiciones(String usuario2,String fecha, String hora,String latitud, String longitud, String alarma){
		String salida="";
		abrirComunicacion();
		
		String informacion = "##;020;" + usuario2 + ";" + fecha + ";"
				+ hora + ";"  + latitud+";"+longitud+";"+alarma+";**";
		System.out.println("envio trama posiciones"+informacionRegistro);
		informacionRegistro=encrypt(informacion, claveEncriptacion);
		if (connect() == true) {
			sendMensaje(informacionRegistro);
			String informacionRecibida=decrypt(receiveMensaje(), claveEncriptacion);
			datosRecibidos = descomposeTrama(informacionRecibida);
			if (datosRecibidos[0].compareTo("##") == 0) {
				if (datosRecibidos[1].compareTo("021") == 0) {
					if (datosRecibidos[2].compareTo("1") == 0) {
						salida = "1";// Correcto
					}
				}
			}
		} else {
			salida = "e";
		}
		
		return salida;
	}

	public String gestionarConexionConfirmacionVehiculoRecarga(String confirmacion,
			String nomUsuario, String nomZona, String idSubcalle, String fecha,
			String horaActual, String placa) {
		// TODO Auto-generated method stub
		String salida = "";
		abrirComunicacion();
		String informacion = "##;018;" + confirmacion + ";" + nomUsuario + ";"
				+ nomZona + ";" + idSubcalle + ";" + fecha + ";"
				+ horaActual + ";"  + placa + 
				 ";**";
		informacionRegistro=encrypt(informacion, claveEncriptacion);
		if (connect() == true) {
			sendMensaje(informacionRegistro);
			String informacionRecibida=decrypt(receiveMensaje(), claveEncriptacion);
			datosRecibidos = descomposeTrama(informacionRecibida);
			if (datosRecibidos[0].compareTo("##") == 0) {
				if (datosRecibidos[1].compareTo("019") == 0) {
					if (datosRecibidos[2].compareTo("1") == 0) {
						salida = "1";// Correcto
					}
				}
			}
		} else {
			salida = "e";
		}
		return salida;
	}

	public String envioInformacionVehiculo(String infousuario,
			String infoNombreZona, String infoIdSubCalle,
			int infoespacioRegistro, String placa, String color, String marca,
			String horaControl, String fechacontrol) {
		// TODO Auto-generated method stub
		String salida = "";
		abrirComunicacion();
		/*informacionRegistro = "##;003;" + infousuario + ";" + infoNombreZona
				+ ";" + infoIdSubCalle + ";" + fechacontrol + ";" + horaControl
				+ ";" +color+";" + placa+";" + marca +";**";*/
		String informacionRegistroS = "##;003;" + infousuario + ";" + infoNombreZona
				+ ";" + infoIdSubCalle + ";" + fechacontrol + ";" + horaControl
				+ ";" +color+";" + placa+";" + marca +";**";
		informacionRegistro=encrypt(informacionRegistroS, claveEncriptacion);
		System.out.println("envio trama informacion"+informacionRegistro);
		if (connect() == true) {
			sendMensaje(informacionRegistro);
			String informacionRecibida=decrypt(receiveMensaje(), claveEncriptacion);
			//datosRecibidos = descomposeTrama(receiveMensaje());
			datosRecibidos = descomposeTrama(informacionRecibida);
			if (datosRecibidos[0].compareTo("##") == 0) {
				if (datosRecibidos[1].compareTo("004") == 0) {
					if (datosRecibidos[2].compareTo("0") == 0) {
						salida = "0"; // el usuario no existe ni en la tabla exonerados ni en usuarios de recarga
					}
					if (datosRecibidos[2].compareTo("1") == 0) {
						salida = "1"; // el usuario es usuario de recarga
					}
					if (datosRecibidos[2].compareTo("2") == 0) {
						
						salida = "2"; // recarga el usuario es usuario de recarga y no ha activado el servicio
					}
					if (datosRecibidos[2].compareTo("3") == 0) {
						salida = "3"; // el usuario es exonerado
					}
				}
			}
		} else {
			salida = "e";
		}
		return salida;
	}

	public String envioInformacionVehiculoNoActivacionRecarga(
			String infousuario, String infoNombreZona, String infoIdSubCalle,
			int infoespacioRegistro, String placa, String color, String marca,
			String horaControl, String fechacontrol) {
		// TODO Auto-generated method stub
		String salida = "";
		abrirComunicacion();
		String informacion = "##;005;" + infousuario + ";" + infoNombreZona
				+ ";" + infoIdSubCalle + ";" + fechacontrol + ";" + horaControl
				+ ";" +color+";" + placa+";" + marca +";**";
		informacionRegistro=encrypt(informacion, claveEncriptacion);
		if (connect() == true) {
			sendMensaje(informacionRegistro);
			String informacionRecibida=decrypt(receiveMensaje(), claveEncriptacion);
			datosRecibidos = descomposeTrama(informacionRecibida);
			if (datosRecibidos[0].compareTo("##") == 0) {
				if (datosRecibidos[1].compareTo("006") == 0) {
					if (datosRecibidos[2].compareTo("1") == 0) {
						salida = "1"; // Datos enviados Corectamente
					}
				}
			}
		} else {
			salida = "e";
		}
		return salida;
	}
	
	public String gestionCerrarSesion(String nomUsuario, String confirmacion) {
		// TODO Auto-generated method stub
		String salida = "";
		abrirComunicacion();
		String informacion = "##;022;" + nomUsuario + ";" + confirmacion + ";**";
		informacionRegistro=encrypt(informacion, claveEncriptacion);
		if (connect() == true) {
			sendMensaje(informacionRegistro);
			String informacionRecibida=decrypt(receiveMensaje(), claveEncriptacion);
			datosRecibidos = descomposeTrama(informacionRecibida);
			if (datosRecibidos[0].compareTo("##") == 0) {
				if (datosRecibidos[1].compareTo("023") == 0) {
					if (datosRecibidos[2].compareTo("1") == 0) {
						salida = "1";// Correcto
					}
				}
			}
		} else {
			salida = "e";
		}
		return salida;
	}

	public String SicronizarMultas(String datosSicronizar) {
		// TODO Auto-generated method stub
		String salida = "";
		abrirComunicacion();
		String informacion = "##;024;" + datosSicronizar + ";**";
		informacionRegistro=encrypt(informacion, claveEncriptacion);
		if (connect() == true) {
			sendMensaje(informacionRegistro);
			String informacionRecibida=decrypt(receiveMensaje(), claveEncriptacion);
			datosRecibidos = descomposeTrama(informacionRecibida );
			if (datosRecibidos[0].compareTo("##") == 0) {
				if (datosRecibidos[1].compareTo("025") == 0) {
					if (datosRecibidos[2].compareTo("1") == 0) {
						salida = "1";// Correcto
					}
				}
			}
		} else {
			salida = "e";
		}
		return salida;
	}
	public static String encrypt(String cadena,String clave) { 
        StandardPBEStringEncryptor s = new StandardPBEStringEncryptor(); 
        s.setPassword(clave); 
        return s.encrypt(cadena); 
    }

	public static String decrypt(String cadena,String clave) { 
	        StandardPBEStringEncryptor s = new StandardPBEStringEncryptor(); 
	        s.setPassword(clave); 
	        String devuelve = ""; 
	        try { 
	            devuelve = s.decrypt(cadena); 
	        } catch (Exception e) { 
	        } 
	        return devuelve;
	}


}
